<?php
/**
 * Data Access for Canciones table
 *
 * @author janunezc
 */

require_once ("DataAccessHelper.php");
require_once ("BE/BECancion.php");
class DA_Canciones {
    public static function guardarCancion($cancion){
        if($cancion->cancion_id==0 || $cancion->cancion_id=='--Nuevo--'){/*INSERT*/
            $sqlCmd = " INSERT INTO canciones (titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                        VALUES ('$cancion->titulo',
                                '$cancion->introduccion',
                                '$cancion->cancion_y_notas',
                                '$cancion->creditos',
                                $cancion->dur_min,
                                $cancion->intro_dur_sec,
                                '$cancion->actualizacion_por'
                                )
                        " ;
        } else {/*UPDATE*/
            
            $sqlCmd = " UPDATE canciones
                        SET titulo = '$cancion->titulo',
                            introduccion = '$cancion->introduccion',
                            cancion_y_notas = '$cancion->cancion_y_notas',
                            creditos='$cancion->creditos',
                            dur_min='$cancion->dur_min',
                            intro_dur_sec=$cancion->intro_dur_sec,
                            actualizacion_por = '$cancion->actualizacion_por'
                        WHERE cancion_id = $cancion->cancion_id";
        }

        DataAccessHelper::executeSQL($sqlCmd);
        DA_Canciones::crearRegistrodeAuditoria($cancion);

        if($cancion->cancion_id==0 || $cancion->cancion_id=='--Nuevo--'){/*NEW RECORD*/
            $cancion = DA_Canciones::obtenerCancionPorTitulo($cancion->titulo);
        }
        return $cancion;
    }

    /**
     *
     * @param BECancion $cancion
     * @return void
     */
    public static function crearRegistrodeAuditoria($cancion){
        if($cancion->cancion_id > 0 && $cancion->cancion_id!='--Nuevo--'){
            $sqlCmd_Audit = "   INSERT INTO audit_canciones (operacion,cancion_id,titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                                VALUES ('U',
                                        $cancion->cancion_id,
                                        '$cancion->titulo',
                                        '$cancion->introduccion',
                                        '$cancion->cancion_y_notas',
                                        '$cancion->creditos',
                                        $cancion->dur_min,
                                        $cancion->intro_dur_sec,
                                        '$cancion->actualizacion_por'
                                        )
                                " ;
        } else {
            $cancion = DA_Canciones::obtenerCancionPorTitulo($cancion->titulo);
            $sqlCmd_Audit = "   INSERT INTO audit_canciones (operacion,cancion_id,titulo, introduccion, cancion_y_notas,creditos,dur_min,intro_dur_sec,actualizacion_por)
                                VALUES ('I',
                                        $cancion->cancion_id,
                                        '$cancion->titulo',
                                        '$cancion->introduccion',
                                        '$cancion->cancion_y_notas',
                                        '$cancion->creditos',
                                        $cancion->dur_min,
                                        $cancion->intro_dur_sec,
                                        '$cancion->actualizacion_por'
                                        )
                                " ;
        }

        DataAccessHelper::executeSQL($sqlCmd_Audit);
    }

    /***
     *
     */
    public static function buscarCancion($q){
        if ($q=='') return;
        //SEPARATE QUERY INTO WORDS
        $words = explode(" ", $q);

        //BUILD WHERE CRITERIA
        $sqlCompare_titulo = "";
        $sqlCompare_cancion = "";
        $firstTime = TRUE;
        foreach($words as $word){
            if($firstTime){
                $sqlCompare_titulo.="c.titulo like '%$word%'";
                $firstTime=FALSE;
            } else {
                $sqlCompare_titulo.="AND c.titulo like '%$word%'";
            }
        }

        $firstTime = TRUE;
        foreach($words as $word){
            if($firstTime){
                $sqlCompare_cancion.="cancion_y_notas like '%$word%'";
                $firstTime=FALSE;
            } else {
                $sqlCompare_cancion.="AND cancion_y_notas like '%$word%'";
            }
        }

        //BUILD SQL COMMAND
        $SQLCommand = "  SELECT c.cancion_id,
                         c.titulo,
                         max(r.fecha) as fecha_repertorio
                         FROM canciones c
                         left outer join repertorios_canciones rc on rc.cancion_id = c.cancion_id
                         left outer join repertorios r on r.repertorio_id = rc.repertorio_id                         
                         WHERE ($sqlCompare_titulo) OR ($sqlCompare_cancion)
                         group by c.cancion_id, c.titulo
                         ORDER BY titulo
            ";

        $queryResult = DataAccessHelper::executeSQL($SQLCommand);
        $canciones = null;
        
        if($queryResult){
            while($row = mysql_fetch_row($queryResult)){
                $canciones[$row[0]]=$row[1]."($row[2])";
            }
        }
        return $canciones;
    }
    public static function obtenerCancionPorTitulo($titulo){
        $sqlCmd = "
            SELECT  cancion_id,
                    titulo,
                    introduccion,
                    cancion_y_notas,
                    creditos,
                    dur_min,
                    intro_dur_sec,
                    actualizacion_fecha,
                    actualizacion_por
        FROM canciones WHERE titulo = '$titulo'";
        $result = DataAccessHelper::executeSQL($sqlCmd);
        if($result){
            $row = mysql_fetch_row($result);

            $cancion = DA_Canciones::fillBECancion($row);
        }

        return $cancion;

    }
    public static function obtenerCancion($id){
        $sqlCmd = "
            SELECT  cancion_id,
                    titulo,
                    introduccion,
                    cancion_y_notas,
                    creditos,
                    dur_min,
                    intro_dur_sec,
                    actualizacion_fecha,
                    actualizacion_por
        FROM canciones WHERE cancion_id = $id";
        $result = DataAccessHelper::executeSQL($sqlCmd);
        if($result){
            $row = mysql_fetch_row($result);
            
            $cancion = DA_Canciones::fillBECancion($row);
        }
        
        return $cancion;
    }

    /**
     * Recibe una cancion (BECancion) y devuelve el texto correspondiente a la letra de la canción sin notas.
     * @param <type> $cancion_y_notas
     * @return <type> 
     */
    public static function obtenerSoloLetra($cancion_y_notas){
       $lineas = explode("\n", $cancion_y_notas);
        ////split("\n",$cancion_y_notas);

       $resultado = "";
       foreach($lineas as $linea){
           if(trim($linea=="")) continue;
           $tipoDeLinea = DA_Canciones::determinarTipoDeLinea($linea);
           switch($tipoDeLinea){
               case "LETRA":
                   $resultado.="$linea\n";
                   break;
               default://SIMPLEMENTE SE DESCARTAN LAS LINEAS DE TIPO DIFERENTE A LETRA
           }
       }
       return $resultado;
    }

    /**
     * Determina el tipo de Linea para la linea suministrada:
     *  - INSTRUCCION
     *  - ACORDE
     *  - LETRA
     * @param <type> $linea 
     * @return <type> String
     */
    private static function determinarTipoDeLinea($linea){
        $linea_sin_espacios = trim($linea);
        if(DA_Canciones::contains($linea_sin_espacios, '<') || DA_Canciones::contains($linea_sin_espacios, '-')){
            return "INSTRUCCIONES";
        }

        $palabras = explode(" ", $linea);
        $cuenta_acordes = 0;
        $cuenta_letras = 0;
        foreach($palabras as $palabra){
            if(trim($palabra)=="") continue;
            if(DA_Canciones::hayTrazosDeAcordes($palabra)){
                $cuenta_acordes ++;
            } else {
                $cuenta_letras ++;
            }
        }
        
        if($cuenta_acordes > $cuenta_letras){
            return "ACORDES";
        } else {
            return "LETRA";
        }
    }

    private static function hayTrazosDeAcordes($palabra){
        $posibleAcorde = substr($palabra, 0, 4);
        if(DA_Canciones::contains($posibleAcorde,'DO')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'RE')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'MI')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'FA')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'SOL')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'LA')) return TRUE;
        if(DA_Canciones::contains($posibleAcorde,'SI')) return TRUE;
        return FALSE;
    }

    private static function contains($string_to_look_at, $string_to_look_for){
        $string_to_look_at = strtolower($string_to_look_at);
        $string_to_look_for = strtolower($string_to_look_for);
        $compare = strpos($string_to_look_at,$string_to_look_for);
        if($compare === FALSE){
            return FALSE;
        } else {
            return TRUE;
        }
    }
    private static function fillBECancion($row){
        $cancion = new BECancion();
        $cancion->cancion_id = $row[0];
        $cancion->titulo=$row[1];
        $cancion->introduccion=$row[2];
        $cancion->cancion_y_notas=$row[3];
        $cancion->creditos=$row[4];
        $cancion->dur_min=$row[5];
        $cancion->intro_dur_sec=$row[6];
        $cancion->actualizacion_fecha=$row[7];
        $cancion->actualizacion_por=$row[8];

        return $cancion;
    }
}
?>
